/**
 * @LocaleException.java  COPYRIGHT xiaojian
 * 
 * Created on 2019年4月10日 下午5:14:58
 */
package xj.toolkit.exception;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

import org.apache.commons.lang3.StringUtils;

import xj.toolkit.base.BaseResultCode;
import xj.toolkit.base.ResultCode;

/**
 * @author <a href="mailto:cxj2000@gmail.com">xiaojian.cao</a>
 *
 */
public class LocaleException extends RuntimeException {

	private static final long serialVersionUID = 1L;

	protected ResultCode errorCode = BaseResultCode.OK;

	protected String message;

    /**
     * 构造方法
     *
     * @param errorCode 错误码枚举
     * @param cause
     */
    public LocaleException(){}
	
	/**
	 * 构造方法
	 * 
	 * @param errorCode
	 *            错误码枚举
	 * @param cause
	 */
	public LocaleException(ResultCode errorCode, Throwable cause) {
		super(cause);
		this.errorCode = errorCode;
		this.message = errorCode.getDescription();
	}

	/**
	 * 构造方法
	 * 
	 * @param resourceKey
	 *            资源键，用于检索国际化的资源。
	 * @param message
	 *            信息，一般只用于记录日志
	 * @param cause
	 */
	public LocaleException(String resourceKey, String message, Throwable cause) {
		super(cause);
		this.message = message;
	}

	/**
	 * 获取错误码
	 * 
	 * @return
	 */
	public ResultCode getErrorCode() {
		return errorCode;
	}

	/**
	 * 错误码
	 * 
	 * @param errorCode
	 */
	public void setErrorCode(ResultCode errorCode) {
		this.errorCode = errorCode;
		this.message = errorCode.getDescription();
	}

	/**
	 * 获取异常堆栈字符串
	 * 
	 * @return
	 */
	public String getStackTraceString() {
		ByteArrayOutputStream os = new ByteArrayOutputStream();
		PrintStream stream = new PrintStream(os);
		printStackTrace(stream);
		return os.toString();
	}

	/**
	 * 获取异常描述
	 *
	 * @return
	 */
	public String getDescription(){
		return errorCode.getDescription();
	}

	public String getMessage() {
		return "resultCode:" + errorCode.getResultCode() + "\r" + "errorMsg:"
				+ errorCode.getDescription()
				+ (super.getMessage() == null ? "" : "\r" + super.getMessage());
	}
	
	/**
	 * 格式化描述，如果支持的话。
	 * 
	 * @param argument
	 */
	public LocaleException formatMessage(String... argument) {
		if (StringUtils.isNotBlank(this.getMessage())) {
			String.format(this.getMessage(), argument);
		}
		
		return this;
	}
}

